﻿using System;
using System.Collections.Generic;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLEmpleados
    /// </summary>
    class BLIMPLEmpleados:Presupuesto_BL.BLEmpleados
    {
        DAOEmpleados createEmpleado = DAOFactoryPresupuesto.createEmpleado();
        BLSectores createSector = BLFactoryPresupuesto.createSector();

        /// <summary>
        /// Guarda un empleado
        /// </summary>
        /// <param name="e">Objeto que tiene los datos del empleado a guardar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveEmpleado(empleadosDTO e)
        {
            Boolean correcto = false;
            
            try
            {
                sectoresDTO sector = createSector.getSector(e.Sector);
                Boolean insertado = createEmpleado.saveEmpleado(sector.ID, e.Nombre, e.Apellido, e.Usuario, e.Password, e.Mail, e.Activo);

                if (insertado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Modifica un empleado
        /// </summary>
        /// <param name="e">Objeto que tiene los datos del empleado a modificar</param>
        /// <param name="usuario">Determina el empleado a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateEmpleado(empleadosDTO e, string usuario)
        {
            Boolean correcto = false;

            try
            {
                empleados emp = createEmpleado.getEmpleado(usuario);

                if (null != emp)
                {
                    sectoresDTO sector = createSector.getSector(e.Sector);
                    Boolean modificado = createEmpleado.updateEmpleado(sector.ID, e.Nombre, e.Apellido, e.Usuario, e.Password, e.Mail, e.Activo, emp.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Elimina un empleado
        /// </summary>
        /// <param name="usuario">Determina el empleado a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteEmpleado(string usuario)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createEmpleado.deleteEmpleado(usuario);

                if (eliminado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Listado de empleados
        /// </summary>
        /// <returns>Devuelve una lista con los empleados</returns>
        public List<empleadosDTO> getAllEmpleado()
        {
            List<empleadosDTO> listadoEmpleados = null;

            try
            {
                List<empleados> empleados = createEmpleado.getAllEmpleado();
                DataTable sectores = createSector.getAllSector();

                if (null != empleados)
                {
                    listadoEmpleados = new List<empleadosDTO>();

                    foreach (empleados e in empleados)
                    {
                        empleadosDTO empleado = new empleadosDTO();
                        empleado.Activo = e.Activo;
                        empleado.Apellido = e.Apellido;
                        empleado.ID = e.ID;
                        empleado.Mail = e.Mail;
                        empleado.Nombre = e.Nombre;
                        empleado.Password = e.Password;
                        empleado.Usuario = e.Usuario;
                        empleado.Sector = sectores.Select("id = " + e.ID_Sector + "")[0]["Nombre"].ToString();
                        listadoEmpleados.Add(empleado);
                    }
                }
            }
            catch (Exception ex)
            {

                listadoEmpleados = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoEmpleados;
        }

        /// <summary>
        /// Obtiene un empleado
        /// </summary>
        /// <param name="usuario">Determina el usuario a obtener</param>
        /// <returns>Devuelve un objeto empleado</returns>
        public empleadosDTO getEmpleado(string usuario)
        {
            empleadosDTO empleado = null;

            try
            {
                empleados e = createEmpleado.getEmpleado(usuario);
                DataTable sectores = createSector.getAllSector();

                if (null != e)
                {
                        empleado = new empleadosDTO();
                        empleado.Activo = e.Activo;
                        empleado.Apellido = e.Apellido;
                        empleado.ID = e.ID;
                        empleado.Mail = e.Mail;
                        empleado.Nombre = e.Nombre;
                        empleado.Password = e.Password;
                        empleado.Usuario = e.Usuario;
                        empleado.Sector = sectores.Select("id = " + e.ID_Sector + "")[0]["Nombre"].ToString();
                }
            }
            catch (Exception ex)
            {

                empleado = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return empleado;
        }

        /// <summary>
        /// Tabla de Empleados
        /// </summary>
        /// <returns>Devuelve una tabla con los empleados</returns>
        public DataTable getTablaEmpleados()
        {
            DataTable tablaEmpleados = null;
            
            try
            {
                DataTable te = createEmpleado.getTablaEmpleados();

                if (null != te)
                {
                    tablaEmpleados = te;
                }

            }
            catch (Exception ex)
            {
                tablaEmpleados = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return tablaEmpleados;
        }
    }
}
